let obj = {
  a: "ceshi",
  b: {
    c: "发时间肯定会",
    d: "kliwe",
    e: {
      f: "sdfads",
    },
  },
  m: ["12", 56, 3],
};
let objDeepCopy = function (source) {
  let sourceCopy = source instanceof Array ? [] : {};
  for (item in source) {
    sourceCopy[item] =
      typeof source[item] === "object"
        ? objDeepCopy(source[item])
        : source[item];
  }
  return sourceCopy;
};

let copy = objDeepCopy(obj);
copy.b.e.f = "113135";
// console.log(obj);

// 判断数组的方式
/**
 * 
 * a instanceof Array   bool  但是这种情况会不准 因为prototype的属性是可以修改的    可以通过实例的方法，也可以通过Object.create()
 * a.constructor === Array;/  但是这种情况会不准 因为prototype的属性是可以修改的
 * Object.prototype.toString.call(a) === '[object Array]';//true   它强大的地方在于不仅仅可以检验是否为数组，比如是否是一个函数，是否是数字等等
 * Array.isArray(a);//true 这个是es5提出的，存在兼容性问题
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
console.log(Array.prototype.isPrototypeOf(arr)); // true

简单来说就是Object.prototype.toString()会返回[object, [[class]]]的字符串，其中，[[class]]是es定义的类型，包含"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", 和 "String"；再加上es5新增加的返回[object Undefined]和[object Null]

 * if (!Array.isArray) { // 猴子补丁
    Array.isArray = function(arg) {
      return Object.prototype.toString.call(arg) === '[object Array]';
    };
}
 *  */

// console.log(copy)
// console.log(obj)
